Systemd 相关
Table of Contents
1. 系统进程管理 systemctl
1.1. 配置文件相关目录
systemd 的作用是管理系统服务,配置文件大部分放置于 /lib/systemd/system 内。但是 Red Hat 官方文件指出, 该目录的文件主要是原本软件所提供的设置,不建议修改。
修改后的配置文件应在 /etc/systemd/system 内。
举例,vsftpd.service 这个服务:
- /usr/lib/systemd/system/vsftpd.service: 官方释出的默认配置文件;
- /etc/systemd/system/vsftpd.service.d/custom.conf: 在 /etc/systemd/system 下创建目录,目录名称为
<service_name>.service.d
格式,再在该目录下创建配置文件。这个目录下的配置文件会 累加其他设置 进入 /lib/systemd/system/vsftpd.service 内。 - /etc/systemd/system/vsftpd.service.wants/*: 目录内的文件为链接文件,设置相依服务的链接。意为在启动 vsftpd.service 之后 ,再加上这目录下面建议的服务。
- /etc/systemd/system/vsftpd.service.requires/*: 目录内的文件为链接文件,设置相依服务的链接。意为在启动 vsftpd.service 之前 ,需要先启动哪些服务。
尽管直接改 /lib/systemd/system 文件也有效,但 软件升级时,系统会用新软件包内的新配置文件覆盖旧的配置文件 。
1.2. .service 文件中以横线开头的命令
比如 nginx.service 文件中有这么一段配置:
[Service] ... ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid ...
可以看到,这个命令以 -
横线开头。
这意味着 systemd 会记录那些标志着命令执行失败的程序的退出代码 (即进程返回值非 0 或由于信号导致的退出),但不会产生进一步的影响。同时,忽略这些标志着命令执行失败的程序的返回值,将命令按照执行成功处理。
1.3. 挂载硬盘
在 /etc/systemd/system/<name>.mount
配置硬盘自动挂载。
这里给一个例子 /etc/systemd/system/mnt-hgst8t2nd.mount:
[Install] WantedBy=multi-user.target [Mount] Options=defaults Type=ext4 What=/dev/disk/by-uuid/cd2949ed-9e14-4a34-a703-6dcbd761e9d3 Where=/mnt/hgst8t2nd [Unit] Description=Mount 2nd HGST 8T disk under /mnt/hgst8t2nd.
systemctl enable --now mnt-hgst8t2nd.mount
可以让硬盘开机自动挂载。
注意:
- 必须以 .mount 作为文件名结尾。
- .mount 文件的名称必须为 where 字段路径的内容。
比如,例子中 Where 字段为 Where=/mnt/hgst8t2nd
则对应的文件名必须是 mnt-hgst8t2nd.mount
。
2. 网络管理 systemd-networkd
2.1. 基础配置
systemd-neworkd 在管理多张网卡时,可以使用正则表达式匹配网卡,比如 eth* 匹配 eth0/eth1.../ 等等网卡。在 /etc/systemd/network/00-dhcp.network 配置如下:
[Match] Name=eth* [Network] DHCP=ipv4 [DHCP] ClientIdentifier=duid
相比 networking 服务默认将网卡的 MAC 地址作为 DHCP 的 Client ID ,systemd-networkd 可以有更多的选择:
mac
表示使用网卡 MAC 地址;duid
是 **默认值**,表示使用符合 RFC4361 规范的客户端 ID ( 也就是 IAID 与 DUID 的组合 );duid-only
表示使用 DUID ( 可能与 RFC 规范不兼容,但某些场合需要这样做 )。
2.2. 虚拟机中的 DHCP 客户端标识
在对使用 systemd-networkd 的 KVM 虚拟机进行复制时,如果不对 systemd-networkd 进行配置,即使生成了新的 MAC 地址,路由器可能依旧会给虚拟机分配上次得到的 IP 地址。
这是因为 systemd-networkd 默认使用 duid 作为 DHCP 客户端标识,而 duid 依赖 /etc/machine-id。
所有虚拟机的都是基于同一个原始 qcow2 镜像,而在复制过程中并没有改变 /etc/machine-id 的内容,相当于所有新的虚拟机使用了同一个 /etc/machine-id。最终 DHCP 服务器收到的所有请求来源于同一个 duid,因此分配同样的IP给客户端。
最终的配置要把
[DHCP] ClientIdentifier=duid
改为:
[DHCP] ClientIdentifier=mac
3. DNS 管理 systemd-resolved
systemd-resolved 服务在本地的 53 端口建立了一个 DNS stub resolver 服务器。
DNS stub resolver 只把查询转发到上游 DNS,自己不做解析,通常用于在本地主机或网络上引入 DNS 缓存。
在 /etc/systemd/resolvd.conf 设定 DNSStubListener=no
以后可以关闭 DNS stub resolver,这个操作可以解放本机的 53 端口。
systemd-resolved 有四种不同的模式来处理域名解析:
- systemd-resolved 实时更新 /run/systemd/resolve/stub-resolv.conf 文件以确保兼容传统的 Linux 程序。将软连接 /etc/resolv.conf 指向该文件。该文件将 127.0.0.53 设为唯一的 DNS 服务器,并包含 systemd-resolved 使用的搜索域列表。搜索域列表将会始终保持实时更新。注意,应用程序不应该直接使用 /run/systemd/resolve/stub-resolv.conf 文件,而应该继续使用 /etc/resolv.conf 文件(指向它的软连接)。这样,未使用本地 D-Bus DNS API 的客户端,既可以与 systemd-resolved 通信、又可以正确使用搜索域。**这是推荐用这个方式**。
- 一个静态 /usr/lib/systemd/resolv.conf 文件, 此文件仅包含一个唯一的 127.0.0.53 DNS 服务器。将软连接 /etc/resolv.conf 指向该静态文件。这样,未使用本地 D-Bus DNS API 的客户端,也可以与 systemd-resolved 通信。此文件不包含任何搜索域。
- systemd-resolved 实时更新 /run/systemd/resolve/resolv.conf 文件以确保兼容传统的 Linux 程序。将软连接 /etc/resolv.conf 指向该文件。注意,此文件只包含所有已知的全局 DNS 服务器,而不包含针对特定网络接口设置的 DNS 服务器。注意,应用程序不应该直接使用 /run/systemd/resolve/resolv.conf 文件, 而应该继续使用 /etc/resolv.conf 文件(指向它的软连接)。这样,未使用本地 D-Bus DNS API 的客户端,也将同时绕开 systemd-resolved 服务,直接与已知的全局 DNS 服务器通信。
- 由其他软件包或系统管理员维护 /etc/resolv.conf 的内容。 在这种情况下,systemd-resolved 将会从中读取全局 DNS 配置。也就是说,systemd-resolved 只是一个 /etc/resolv.conf 文件的使用者,而非此文件的提供者。
使用哪个模式完全取决于 /etc/resolv.conf 是否为软连接,以及该软连接指向的目标。不需要特别的配置。
4. 时间管理 timedatectl
执行 timedatectl
可以看到系统目前的时间设定:
Local time: Sat 2020-04-18 04:54:50 CST Universal time: Fri 2020-04-17 20:54:50 UTC RTC time: Fri 2020-04-17 12:54:52 Time zone: Asia/Shanghai (CST, +0800) System clock synchronized: no NTP service: active RTC in local TZ: no
timedatectl list-timezones
列出所有的时区,并且找到需要的那个:
… Asia/Samarkand Asia/Seoul Asia/Shanghai Asia/Singapore Asia/Srednekolymsk …
最后 timedatectl set-timezone Asia/Shanghai
设定时区,设定完成后会自动对时。
5. 主机名管理 hostnamectl
主机名分 3 类: static (静态主机名), pretty (好看、易读的主机名) 和 transient (临时的)。和主机名有关的文件为 /etc/hostname,它是在系统初始化的时候被读取的,并且内核根据它的内容设置 transient 主机名。
- static 主机名由 /etc/hostname 文件决定
- pretty 主机名用来展示给用户。它可以提供非标准的主机名,它可以包含特殊符号,例如空格。例如将 pretty 名称命为 "LSZ's Host"
- transient 主机名由内核动态维护。默认情况下,系统启动时会将 transient 主机名初始化为 /etc/hostname 文件中存储的主机名
/etc/hostname 文件中的 static 主机名即时、永久生效。修改后执行 hostname
或者 uname -n
可以直接获取到,重启后也按照此文件的主机名进行初始化。
/etc/hostname 文件中没有存储主机名时,系统启动过程中内核会将 transient 主机名初始化为 localhost.localdomain
。
RedHat 系系统的 /etc/sysconfig/network 文件中设置的主机名不再生效。
hostname
命令修改的是 transient 主机名,即临时生效的主机名- 修改 /etc/hostname 文件瞬时生效,重启后也生效 (内核会文件内容初始化 transient 主机名)。
- RedHat 系系统上默认安装的
nmtui
命令可以以命令行图形化界的方式面修改主机名。命令直接修改 /etc/hostname 文件 - 使用
hostnamectl
命令。它可以修改并查看三种主机名。当它修改 static 主机名时,直接将结果写入 /etc/hostname 文件
查看主机名:
hostnamectl # 或 hostnamectl status # 或 hostnamectl [--pretty | --static | --transient] status
设置主机名:
hostnamectl [--pretty | --static | --transient] set-hostname <name>
在修改了 pretty 主机名时,将取 pretty 名的简化部分作为 static 和 transient 主机名。
给设置主机名的命令传递一个空的字符串 hostnamectl set-hostname ""
可以将主机名重设为默认值。